做好了指標的收集,接下來還有一個很重要的步驟 --- 數據的視覺化,關於這方面的功能雖然 Prometheus 已經有內建簡單的圖表了,然而在實際運行的服務上它還是不夠用,所以通常會看到搭配 Grafana 這套數據視覺化的工具來幫助我們更方便的瀏覽與分析收集到的資料。
架設 grafana 的步驟也很簡單,透過 docker image 就可以直接部署了,services
內的定義看起來會像這樣:
grafana:
image: grafana/grafana:8.1.5
restart: unless-stopped
volumes:
- ./grafana/data:/var/lib/grafana
- ./grafana/provisioning:/etc/grafana/provisioning
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD__FILE=/run/secrets/admin_password
- GF_USERS_ALLOW_SIGN_UP=false
ports:
- 3000:3000
secrets:
- source: gf_admin_password
target: admin_password
另外,因為這邊我使用了 docker secrets 來儲存 admin 密碼,所以還需要在 docker-compose.yml
的最上層設定 secrets:
secrets:
gf_admin_password:
file: ./grafana/secrets/admin_password
這樣就可以避免把敏感資訊寫入 docker-compose.yml
裡面了。另外關於 要如何透過環境變數去設定 grafana,可以參考這篇說明,而有關 docker container 的設定在這邊。
另外還有一種作法是直接使用 host 上的環境變數來設定,若是這樣的話,grafana 的設定可能會長得像是下面這樣:
grafana:
image: grafana/grafana:8.1.5
restart: unless-stopped
volumes:
- ./grafana/data:/var/lib/grafana
- ./grafana/provisioning:/etc/grafana/provisioning
environment:
- GF_SECURITY_ADMIN_USER=$GF_ADMIN
- GF_SECURITY_ADMIN_PASSWORD=$GF_ADMIN_PASS
- GF_USERS_ALLOW_SIGN_UP=false
ports:
- 3000:3000
按照上面的定義,只要在我的 host 上面去設定 GF_ADMIN
和 GF_ADMIN_PASS
兩個環境變數(也可以透過同目錄底下的 .env
檔),就可以在創建服務時注入到 container 內,詳細的說明可以參考 docker 的官方文件。
最後,還需要去修改 grafana/data
這個資料夾的權限設定,讓他的 uid 與 container 使用的一致,所以在補一個 sudo chown -R 472:root grafana/data
,或是在 service 的定義裡面指定 uid 也是可以的選項。
都設定好之後,執行 docker-compose up -d
就可以把他們跑起來了,然後進到 http://localhost:3000
,輸入剛剛設定的帳號密碼,就能看到 grafana 的首頁了。
要做資料視覺化,我們首先要有資料嘛,所以第一步就是要來定義我們的資料哪裡來,在 grafana 裡面這就叫做 data source,目前官方有支援許多常見的工具(列表),甚至有需要的話我們可以自己開發 data source。那麼現在,我們先來設定一個 Prometheus 的 data source 吧。
首先點下首頁那個大大的寫有 "Add your first data source" 的按鈕。
然後選擇 Prometheus。
在 URL 欄位填入 http://prometheus:9090
。
按下最下面的 "Save & test",若是有跳出綠色勾勾,那麼我們就成功了。
接下來,我們就要來畫圖表了,然而懶人如我,通常都是習慣直接上 grafana 的官網,找找社群提供的模板匯入,像是這個就是做 caddy 資料的視覺化的。所以第一步,我們就先來複製它的 ID。
然後再點左邊的 Import。
把剛剛的 ID 貼上去,按下 Load。
然後選擇一個 data source,按下 import。然後...就會發現它顯示一堆 no data,這也是使用模板的時候可能會遇到的一些問題,那麼明天就來試試看如何修復它吧!